home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / system / csh4.zip / CP.C < prev    next >
C/C++ Source or Header  |  1985-09-04  |  4KB  |  154 lines

  1. #include <stdio.h>
  2. char *me;
  3. /* cp.c - implements a version of UNIX cp */
  4. char target_name[128];
  5. cp(argc,argv)
  6. int argc;
  7. register char *argv[];
  8. {
  9.     static char *usage = "cp : usage cp file1 [file2 . . fileN] target\r\n";
  10.     char target[128],*fname_part();
  11.     register int i;
  12.     me = argv[0];
  13.     if (argc < 3)
  14.     {
  15.     write(2,usage,strlen(usage));
  16.     return(-1);
  17.     }
  18.     strcpy(target, argv[argc-1]);
  19.     /* kill trailing backslashes */
  20.     if (target[i = strlen(target) - 1] == '\\')
  21.     target[i] = '\0';
  22.     if (argc == 3)
  23.     {
  24.     if (target[1] == ':' && !target[2])
  25.         strcat(target,fname_part(argv[1]));
  26.     /* if the target doesn't exist and it's not a directory then rename */
  27.     if (access(target,0) && !dirp(target))
  28.     {
  29.         fprintf(stderr,"copying %s to %s\n",argv[1],target);
  30.         filecopy(target,argv[1]);
  31.     }
  32.     else
  33.     {
  34.         /* if the target is a directory copy to same name that directory */
  35.         if (dirp(target))
  36.         {
  37.         int len;
  38.         strcpy(target_name,target);
  39.         if (target_name[(len = strlen(target_name))-1] != '\\')
  40.         {
  41.             target_name[len = strlen(target_name)] = '\\';
  42.             target_name[len+1] = '\0';
  43.         }
  44.         strcat(target_name,fname_part(argv[1]));
  45.         fprintf(stderr,"copying %s to %s\n",argv[1],target_name);
  46.         filecopy(target_name,argv[1]);
  47.         }
  48.         else
  49.         {
  50.         fprintf(stderr,"copying %s to %s\n",argv[1],target);
  51.         filecopy(target,argv[1]);
  52.         }
  53.     }
  54.     return(0);
  55.     }
  56.     /* handle special case of a drive designation */
  57.     if (target[(i = strlen(target))-1] != ':')
  58.     if (!dirp(target))
  59.     {
  60.         fprintf(stderr,"cp : %s isn't a directory\n",target);
  61.         return(-1);
  62.     }
  63.     for (i = 1; i < argc-1; i++)
  64.     {
  65.     int len;
  66.     strcpy(target_name,target);
  67.     if (target_name[(len = strlen(target_name))-1] != '\\')
  68.     {
  69.         target_name[len = strlen(target_name)] = '\\';
  70.         target_name[len+1] = '\0';
  71.     }
  72.     strcat(target_name,fname_part(argv[i]));
  73.     if (!filep(argv[i]))
  74.     {
  75.         fprintf(stderr,"cp : %s isn't a file\n",argv[i]);
  76.         continue;
  77.     }
  78.     fprintf(stderr,"copying %s to %s\n",argv[i],target_name);
  79.     filecopy(target_name,argv[i]);
  80.     }
  81.     return 0;
  82. }
  83.  
  84. #include <fcntl.h>
  85. char buffer[BUFSIZ*16];
  86. filecopy(target,source)
  87. char *target,*source;
  88. {
  89.     int t,s,r;
  90.     if (-1 == (s = open(source,O_RDONLY)))
  91.     {
  92.         fprintf(stderr,"%s : can't open %s\n",me,target);
  93.         return(-1);
  94.     }
  95.     if (-1 == (t = open(target,O_TRUNC)))
  96.     {
  97.         fprintf(stderr,"%s : can't open %s\n",me,target);
  98.         return(-1);
  99.     }
  100.     while(0 != (r = read(s,buffer,BUFSIZ*16)) && r != -1)
  101.     {
  102.         if(-1 == write(t,buffer,r))
  103.         {
  104.             fprintf(stderr,"%s : error writing %s\n",me,target);
  105.             return(-1);
  106.         }
  107.     }
  108.     close(t); 
  109.     close(s);
  110.     return (0);
  111. }
  112.  
  113. #include <errno.h>
  114. typedef struct
  115. {
  116.     char dos_reserved[21];
  117.     char attribute;
  118.     unsigned file_time;
  119.     unsigned file_date;
  120.     long file_size;
  121.     char file_name[13];
  122. fcb;
  123. fcb dir;
  124.  
  125. dirp(s)
  126. char *s;
  127. {
  128.     /* set the disk transfer address */
  129.     bdos(0x1A,&dir);
  130.     /* do a search first for the directory path */
  131.     return (bdos(0x4E,s,0x10) == 0 && bdos(0x4E,s,0) != 0);
  132. }
  133.  
  134. filep(s)
  135. char *s;
  136. {
  137.     /* set the disk transfer address */
  138.     bdos(0x1A,&dir);
  139.     /* do a search first for the directory path */
  140.     return bdos(0x4E,s,0) == 0;
  141. }
  142. char *fname_part(s)
  143. register char *s;
  144. {
  145.     register char *r; 
  146.     char *rindex();
  147.     if (r = rindex(s,'\\'))
  148.     s = r+1;
  149.     if (r = rindex(s,':'))
  150.     s = r+1;
  151.     return s;
  152. }
  153.